//  ts 中类的访问修饰符：私有属性/公有属性、

// 1. public:共有属性  
// 2. private:私有属性（不可访问）
// 3. protected:受保护属性（不可访问）

export { }  //确保与其他成员冲突，独立作用域


class Person{
    // 定义对象属性变量可以初始化赋值
    // 公有属性无访问限制，不写默认为公有属性
    public name:string
    // 私有属性不可访问,可在类或者子类的静态方法中访问
    private age: number
    // 受保护属性可在类及子类中访问
    protected gender:boolean
    // 参数变量需定义类型
    constructor(name:string,age:number){
        // this指向变量需在对象内静态声明，区别于js的动态赋值变量
        this.name = name
        this.age = age
        this.gender = true
    }
    // 函数变量需定义餐参数类型及返回类型
    say(data:string):void{
        // 函数内部可以调用对象内部变量
        return console.log(`This is a ${data},${this.name}${this.age}`);
    }
}
class Son extends Person{
    // constructor(name:string,age:number){
    //     super(name,age)
    //     // 受保护属性：可在类及其子类中访问
    //     console.log('this is gender',this.gender);   //this is gender true
    // }
    
    // 若在子类私有化对象继承初始函数，将不能创建这个对象，只能通过static的方式创建静态初始化，重新创建一个子类
    private constructor(name:string,age:number){
        super(name,age)
        // 受保护属性：可在类及其子类中访问，具有继承性
        console.log('this is gender',this.gender);   //this is gender true
    }
    // 私有苏醒只有通过创建类访问
    static create(name:string,age:number){
        return new Son(name,age)
    }
}

const p = new Person('deman',39)
 
console.log(p.name);    //公有属性deman
// console.log(p.age);    //私有属性不可在外部访问
// console.log(p.gender);    //受保护属性不可在外部访问

// const p2 = new Son('boy',22)
// console.log(p2);

// 若Son类的初始化继承函数定义为私有属性，则不能外部new Son()创建，需要调用类内部的静态方法重新创建继承子类
const p2 = Son.create('boy',20)
console.log('created Son',p2);   //created Son Son { name: 'boy', age: 20, gender: true }








